package com.yfbao.horizon.inspection.engine.impl;

import com.yfbao.horizon.inspection.config.InspectConfig;
import com.yfbao.horizon.inspection.config.ReportTaskConfig;
import com.yfbao.horizon.inspection.dto.ReportDto;
import com.yfbao.horizon.inspection.dto.ReportInfoResult;
import com.yfbao.horizon.inspection.dto.ReportResult;
import com.yfbao.horizon.inspection.engine.InspectEngine;
import com.yfbao.horizon.inspection.entity.SystemInspectRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 巡检引擎抽象基类
 * 提供通用的实现方法
 */
public abstract class AbstractInspectEngine<T extends ReportInfoResult> implements InspectEngine<T> {

    protected Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 生成任务编号
     * @return 唯一的任务编号
     */
    protected String generateTaskNo() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * 获取当前时间字符串
     * @return 格式化的时间字符串
     */
    protected String getCurrentTimeString() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * 创建报告主表
     * @param config 巡检配置
     * @param reportConfig 报告任务配置
     * @param maxLevel 最高结果等级
     * @return 报告主表对象
     */
    protected ReportResult createReportResult(InspectConfig config, ReportTaskConfig reportConfig, String maxLevel) {
        ReportResult reportResult = new ReportResult();
        reportResult.setTaskNo(config.getTaskNo());
        reportResult.setScanTime(getCurrentTimeString());
        reportResult.setEnv(config.getInspectEnv());
        reportResult.setInspectCategory(config.getInspectCategory());
        reportResult.setInspectResult(maxLevel);
        reportResult.setInspectDesc("巡检完成");
        return reportResult;
    }

    /**
     * 创建报告DTO
     * @param reportResult 报告主表
     * @param infoList 报告详情列表
     * @return 报告DTO对象
     */
    protected ReportDto createReportDto(ReportResult reportResult, List<T> infoList) {
        ReportDto reportDto = new ReportDto();
        reportDto.setReportResult(reportResult);
        reportDto.setInfos(new ArrayList<>(infoList));
        return reportDto;
    }

    /**
     * 转换结果等级
     * 将normal/middle/high转换为none/warn/error
     * @param level 原始等级
     * @return 转换后的等级
     */
    protected String convertLevel(String level) {
        if ("normal".equals(level)) {
            return "none";
        } else if ("middle".equals(level)) {
            return "warn";
        } else if ("high".equals(level)) {
            return "error";
        }
        return "none";
    }

    /**
     * 获取最高结果等级
     * @param levels 等级列表
     * @return 最高等级
     */
    protected String getMaxLevel(List<String> levels) {
        String maxLevel = "normal";
        for (String level : levels) {
            if ("high".equals(level)) {
                return "high";
            } else if ("middle".equals(level)) {
                maxLevel = "middle";
            }
        }
        return maxLevel;
    }

    /**
     * 抽象方法：执行具体的巡检逻辑
     * @param config 巡检配置
     * @return 巡检记录
     */
    protected abstract SystemInspectRecord doInspect(InspectConfig config);
}